<?php

namespace App\Model\Entity;

use Cake\ORM\Entity;
use Cake\I18n\Time;
use Cake\ORM\TableRegistry;

class Emissora extends Entity {

    protected $_accessible = [
        'razaosocial' => true,
        'nomefantasia' => true,
        'responsavel_cadastro' => true,
        'departamento_responsavel' => true,
        'telefone_responsavel' => true,
        'cargo_responsavel' => true,
        'email_responsavel' => true,
        'celular_responsavel' => true,
        '*' => false,
    ];

    protected function _setCpfCnpj($cpf_cnpj) {
        $original = isset($this->_properties['cpf_cnpj']) ? $this->_properties['cpf_cnpj'] : "";

        if (!empty($original) && $cpf_cnpj != $original) {
            if (!isset($this->_errors['cpf_cnpj'])) {
                $this->_errors['cpf_cnpj'] = array();
            }
            array_push($this->_errors['cpf_cnpj'], 'CNPJ não confere com a sua emissora');
            return $original;
        }

        return $cpf_cnpj;
    }

    protected function _setDataAtivacao($data_ativacao) {
        if ($data_ativacao) {
            $date = date_create_from_format('d/m/Y', $data_ativacao);
            $time = new Time($date);
            return $time;
        }

        return null;
    }

    protected function _setDataUltimoPagamento($data_ultimo_pagamento) {
        if ($data_ultimo_pagamento) {
            $date = date_create_from_format('d/m/Y', $data_ultimo_pagamento);
            $time = new Time($date);
            return $time;
        }

        return null;
    }

    protected function _setDataInativacao($data_inativacao) {
        if ($data_inativacao) {
            $date = date_create_from_format('d/m/Y', $data_inativacao);
            $time = new Time($date);
            return $time;
        }

        return null;
    }

    public function ofuscar_CpfCnpj($onlyOnError = false) {
        if (!$onlyOnError || (isset($this->_errors['cpf_cnpj']) && !$this->isNew())) {
            $this->_properties['cpf_cnpj'] = '99.999.999/9999-99';
        }
    }

    protected function _getTimeAgo() {
        $data = new Time($this->_properties['data_aguardar']);
        $ago = $data->timeAgoInWords();
        return $ago;
    }

    public function iniciar() {
        $situacao = $this->get('situacao_id');
        if ($situacao && $situacao != Situacao::Nova) {
            throw new Exception("Emissora com situação inválida");
        }
        $this->set('situacao_id', Situacao::Pendente);
        $this->set('data_entrada', date('Y-m-d H:i:s'));
    }

    public function aprovar() {
        $situacao = $this->get('situacao_id');
        if ($situacao != Situacao::Pendente) {
            throw new Exception("Emissora com situação inválida");
        }

        $counts = TableRegistry::get('EmissorasCount');
        $count_aprovacao = $counts->find('count');
        $this->set('seq_aprovacao', $count_aprovacao);

        $this->set('situacao_id', Situacao::Aprovada);
        $this->set('data_aprovacao', date('Y-m-d H:i:s'));
    }

    public function aprovar_reprovada($motivo) {
        $situacao = $this->get('situacao_id');
        if ($situacao != Situacao::Rejeitada) {
            throw new Exception("Emissora com situação inválida");
        }

        $counts = TableRegistry::get('EmissorasCount');
        $count_aprovacao = $counts->find('count');
        $this->set('seq_aprovacao', $count_aprovacao);

        $this->set('observacao_aprovacao_abert', $motivo);
        $this->set('situacao_id', Situacao::Aprovada);
        $this->set('data_aprovacao', date('Y-m-d H:i:s'));
    }

    public function rejeitar($motivo) {
        $situacao = $this->get('situacao_id');
        if ($situacao != Situacao::Pendente) {
            throw new Exception("Emissora com situação inválida");
        }
        $this->set('observacao_abert', $motivo);
        $this->set('situacao_id', Situacao::Rejeitada);
        $this->set('data_rejeicao', date('Y-m-d H:i:s'));
    }

    public function complementar() {
        $this->set('modified', date('Y-m-d H:i:s'));
    }

    public function finalizar() {
        $situacao = $this->get('situacao_id');
        if ($situacao != Situacao::Aprovada && $situacao != Situacao::Finalizada) {
            throw new Exception("Emissora com situação inválida");
        }
        $this->set('situacao_id', Situacao::Finalizada);
        $this->set('data_finalizacao', date('Y-m-d H:i:s'));
    }

    public function aguardar() {
        $situacao = $this->get('situacao_id');
        if ($situacao != Situacao::Finalizada) {
            throw new Exception("Emissora com situação inválida");
        }

        $this->set('situacao_id', Situacao::Aguardando);
        $this->set('data_aguardar', date('Y-m-d H:i:s'));
    }

    public function publicar() {
        $situacao = $this->get('situacao_id');
        
        if ($situacao != Situacao::Aguardando) {
            throw new Exception("Emissora com situação inválida");
        }
        $this->set('situacao_id', Situacao::Publicada);
        $this->set('data_publicacao', date('Y-m-d H:i:s'));   
    }

    public function addError($field, $error) {
        if (!isset($this->_errors[$field])) {
            $this->_errors[$field] = array();
        }
        array_push($this->_errors[$field], $error);
    }

}
